package cn.tedu.oop2;

/**
 * @author: Dsi
 * @date: 2021/11/9 15:20
 * @description:该类用于多态的入门案例
 */
public class TestDemo {
    public static void main(String[] args) {
        Animal a=new Animal();
        Cat c=new Cat();
        Dog d=new Dog();
        a.play();
        c.play();
        d.play();
        /*2.父类对象不可以使用子类的特有功能*/
//        a.jump();
//        a.run();
        c.jump();
        d.run();
        /*3.口诀1：父类的引用变量指向子类对象的地址值
         *解释: 创建出来的子类对象的地址值，交给父类类型的引用变量来保存*/
        Animal a2=new Cat();
        System.out.println(a2);//a2实际就是cat新new的对象的地址值
        Animal a3=new Dog();
        /*4.口诀2：编译看左边，运行看右边
        解释：必须在父类定义这个方法，才能通过编译，因为多态对象认为自己
        是父类类型，必须要在子类重写父类提供的办法，才能满足多态，因为
        实际干活的是子类
         */
        a2.play();//方法的声明是父类的，方法体的使用是子类的，就像在父类有个超链接，链接到子类去，干活的是子类
        a3.play();
//        a2.jump();
//        a3.jump();


    }
}



/*1.多态的前提：继承+重写*/
class Animal{
    public void play(){
        System.out.println("animal在玩耍");
    }

}
class Cat extends Animal{
    @Override
    public void play(){
        System.out.println("cat不玩耍在吃鱼");
    }
    public void jump(){
        System.out.println("cat跳的老高了");
    }
}
class Dog extends Animal{
    @Override
    public void play() {
        System.out.println("dog不玩耍在吃骨头");
    }
    public void run(){
        System.out.println("dog也跳得老高了");
    }
}